搭建一个Golang开发环境,并理解一些相关的基础知识。关于Go安装及IDE的内容本文不会涉及。
Golang环境配置
环境变量配置
GOROOT
Golang的安装目录,默认为C:\go
或/usr/local/go
,$GOPATH/bin
下有各种工具,通常会自动加入到$PATH
变量中,从而可以全局使用各种golang的命令。
GOPATH
Golang项目的开发工作区,默认为%USERPROFILE%\go
或$home/go
,$GOPATH
不能与$GOROOT相同
,可以设置多个工作区,如GOPATH=/opt/go;$home/go
。
项目目录
一个常见的go项目目录如下:1
2
3
4
5
6
7
8
9
10
11bin/
src/
config/
config.go
hello/
hello.go
test/
test.go
pkg/
install.bat
install.sh
bin:编译生成的可执行文件目录。
src:源码目录。
pkg:编译生成的包、库静态文件,根据操作系统及CPU架构区分不同目录。
基于GOPATH的依赖管理
在golang 1.11之前,被诟病得最多的是其极弱的包依赖管理功能:
- 依赖包需用
go get
手动下载。 - 所有依赖包和项目都放
$GOPATH/src
,如C:\go\src\company\foo\bar
与依赖的包C:\go\src\github.io\x\y
在同一个父目录下,比较混乱。 - 依赖包没有版本概念,因此协作开发时,需将各成员本地
$GOPATH/src
的包统一,或使用第三方包管理工具所依靠的vendor
目录。 - 若部分依赖包依赖于已经失效的包,比如在github上已经更换地址,需要手动修改该依赖包的依赖。
下文会介绍用于改善这种状况的go module
。
GOBIN
通常是$GOPATH/bin
,指向可执行文件的目录。
GOOS与GOARCH
当前操作系统和CPU架构,这两个环境变量涉及到交叉编译。
交叉编译
即在当前环境编译不同操作系统及CPU架构的可执行文件,如:GOOS=linux GOARCH=amd64 go build main.go
则编译为linux-amd64的可执行文件。
常用go命令
go build
用于测试编译过程,如有必要会编译关联的包。
- 如果编译普通包,不会有任何效果。
- 如果编译
main
包,格式形如go build <项目名>/<package>
,会在当前路径下生成一个当前环境的可执行文件,如果带上-o
参数则生成到指定的路径。 - 如果只想编译单个go文件,在
go build
后加上文件名。 - 会忽略
_
及.
开头的go文件。
go clean
移除当前源码包里面编译生成的文件。
go fmt
等同于gofmt -w
命令,用于将代码格式标准化。
go get
动态获取远程包,是下载包和go install
两步的结合。
go install
编译包,如有必要会编译关联的包。
- 如果编译普通包,在
pkg
目录下生成静态文件(.a
文件)。 - 如果编译
main
包,在bin
目录下生成可执行文件。
go mod
在golang 1.12之后,设置环境变量GO111MODULE=on
或GO111MODULE=auto
:
- 若设置为
on
,则使用go module来管理依赖。 - 若设置为
auto
,若项目位于$GOPATH/src
下,则仍使用旧的依靠GOPATH
环境变量的依赖管理模式(即依赖于$GOPATH/src
下的各个包),否则与设置为on
相同。
接着在项目的根目录使用go mod init <项目名或模块名>
生成go.mod
文件,则会:
- 自动下载依赖包且有准确的版本号,下载的包放在
$GOPATH/pkg/mod
下,可以理解为maven的.m2
目录。 - 可以将项目放到任意路径下,不必再放
$GOPATH/src
下。 - 生成的
go.mod
文件会列出依赖关系。 - 对于已转移的包,可以用
go.mod
文件里的replace
语句替换,不用再手动改代码里的依赖了。
需要注意:go.mod
及go.sum
文件需纳入版本控制,从而保持一致防止篡改。
go test
读取源码目录下*_test.go
的文件,并编译出测试所需的可执行文件。
go doc
按照包内函数的排序,读取包文档。